package com.hqq.concurrency.half_syn_half_async;

import java.util.concurrent.*;

/**
 * AsynchronousService
 * 这是一个异步请求层 当有新的请求到达时不会阻塞线程
 * 它将请求传递给同步层 包括一个{@link java.util.concurrent.BlockingQueue}队列和一个线程池 {@link ThreadPoolExecutor}
 * 线程池中的线程在后台同步执行完任务后通过回调方法把结果传递给调用者
 * <p>
 * Created by heqianqian on 2017/8/9.
 */
public class AsynchronousService {

    /**
     * 充当本模式中的同步层 后台执行一些耗时的程序
     */
    private ExecutorService service;

    /**
     * 使用{@code wordQueue}连接同步层和异步层
     * @param workQueue 工作队列
     */
    public AsynchronousService(BlockingQueue<Runnable> workQueue) {
        service = new ThreadPoolExecutor(10, 10, 10, TimeUnit.SECONDS, workQueue);
    }

    public <T> void execute(final AsyncTask<T> task){
        try {
            //一些小任务的操作
            task.onPreCall();
        } catch (Exception e) {
            task.onError(e);
            return;
        }
        service.submit(new FutureTask<T>(task){
            @Override
            protected void done() {
                super.done();
                try {
                    task.onPostCall(get());
                } catch (InterruptedException e) {
                } catch (ExecutionException e) {
                    task.onError(e.getCause());
                }
            }
        });
    }

}

